package com.example.examplebitmappool.test.impl;

import android.graphics.Bitmap;
import android.os.Build;
import android.util.Log;
import android.util.LruCache;

import com.example.examplebitmappool.test.IBitmapPoolTest;

import java.util.TreeMap;

/**
 * author：sunweihao
 * 创建时间：2021/1/1 23:04
 * Describe：这是一个内存复用的实现类
 *   key：bitmap大小
 * value：bitmap
 */

public class BitmapImplTestImpl extends LruCache<Integer,Bitmap> implements IBitmapPoolTest {

    /**
     * @param maxSize for caches that do not override {@link #sizeOf}, this is
     *                the maximum number of entries in the cache. For all other caches,
     *                this is the maximum sum of the sizes of the entries in this cache.
     */
    public BitmapImplTestImpl(int maxSize) {
        super(maxSize);
    }
    TreeMap<Integer,String> treeMap=new TreeMap<>();
    private static final String TAG = "BitmapImplTestImpl";
    /**
     * 获取bitmap
     * @return bitmap或者是null
     * @param w
     * @param h
     * @param rgb565
     */
    @Override
    public Bitmap getBitmap(int w, int h, Bitmap.Config rgb565) {
        //获取传过来的图片大小
        int size=getSize(w,h,rgb565);
        //根据传过来的大小，看看有没有比他大的值
        Integer key = treeMap.ceilingKey(size);
        if (key==null) {
            Log.d(TAG, "get: 没有储存比他大的bitmap,所以在内存堆中创建bitmap");
            return null;
        }
        //LRU中获取有比传过来的bitmap大的bitmap（可以复用）
        Bitmap bitmap = remove(key);
        Log.d(TAG, "getBitmap: 获取到复用池的bitmap");
        return bitmap;
    }

    /**
     * 根据传过来的值获取大小
     * @param w
     * @param h
     * @param config
     * @return
     */
    private int getSize(int w, int h, Bitmap.Config config) {
        int size=w*h*(config==Bitmap.Config.ARGB_8888? 4:2);
        return size;
    }

    /**
     * 储存bitmap，也可能不储存
     * @param bitmap bitmap
     */
    @Override
    public void putBitmap(Bitmap bitmap) {
        //bitmap为空
        if (bitmap==null) {
            return;
        }
        //判断是否为可变的bitmap，这个一定要
        if (!bitmap.isMutable()) {
            return;
        }
        //判断这个bitmap是否大于LRU储存的最大的bitmap
        if (isMoreThanTheMaxSize(bitmap)){
            return;
        }
        //储存到LRU中
        put(getBitmapSize(bitmap),bitmap);
        //储存到treeMap中
        treeMap.put(getBitmapSize(bitmap),null);
    }

    private boolean isMoreThanTheMaxSize(Bitmap bitmap) {
        if (getBitmapSize(bitmap)>=maxSize()) {
            return true;
        }
        return false;
    }

    private int getBitmapSize(Bitmap bitmap) {
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
            return bitmap.getAllocationByteCount();
        }
        return bitmap.getByteCount();
    }

}
